package cz.vse.adventura.po1715.xburj54_bursa.gui;

import cz.pecinovsky.english.pojj.adv_framework.game_gui.IGameG;
import cz.pecinovsky.english.pojj.adv_framework.game_gui.IListener;
import cz.pecinovsky.english.pojj.adv_framework.game_gui.IPlaceG;
import cz.vse.adventura.po1715.xburj54_bursa.data.DataPkg;
import java.awt.Point;
import java.net.URL;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;

/*******************************************************************************
 * Instance třídy {@code GameMap} okno zobrazující plánek místností
 *
 * @author    Jan Bursa
 * @version   1.01
 */
public class GameMap implements IListener<IPlaceG> {

//== KONSTANTNÍ ATRIBUTY TŘÍDY =================================================
    
    
    
//== PROMĚNNÉ ATRIBUTY TŘÍDY ===================================================
//== STATICKÝ INICIALIZAČNÍ BLOK - STATICKÝ KONSTRUKTOR ========================
//== KONSTANTNÍ ATRIBUTY INSTANCÍ ==============================================
    
    /** Okno s plánem hry */
    private final JFrame mapWindow = new JFrame("Plánek hry");
    
    /*GUI, které s oknem pracuje */
    private final GUI_04 gui;
    
    /** Label s plánkem hry */
    private final JLabel mapLabel;
    
    /** URL obrázku hráče */
    private final URL playerImgURL;
    
    /** Ikona hráče */
    private final Icon playerIcon;
    
    /** Label s ikonou hráče */
    private final JLabel playerLabel;
    
    
//== PROMĚNNÉ ATRIBUTY INSTANCÍ ================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ TŘÍDY ========================================
//== OSTATNÍ NESOUKROMÉ METODY TŘÍDY ===========================================

//##############################################################################
//== KONSTRUKTORY A TOVÁRNÍ METODY =============================================
    /***************************************************************************
     *
     */
    public GameMap(GUI_04 gui) {
        this.gui = gui;
        mapWindow.setLayout(null);
        
        mapLabel = new JLabel();
        
        playerImgURL = DataPkg.class.getResource("postava_m.png");
        playerIcon = new ImageIcon(playerImgURL);
        playerLabel = new JLabel(playerIcon);
        playerLabel.setBounds(0, 0, playerIcon.getIconWidth(), playerIcon.getIconHeight());                
        
        mapWindow.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
        
        mapWindow.add(playerLabel);
       
        mapWindow.add(mapLabel);
    }
//== ABSTRAKTNÍ METODY =========================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ INSTANCÍ =====================================
    
    /***************************************************************************
     * Nastaví viditelnost plánku místností
     *
     * @param mapState - boolean hodnota viditelnosti
     */
    void setVisible(Boolean mapState) {
        mapWindow.setVisible(mapState);
    }
    
//== OSTATNÍ NESOUKROMÉ METODY INSTANCÍ ========================================
    
    /***************************************************************************
     * Hlášeni o výskytu očekávané události.
     *
     * @param actualPlace Objekt, který je schopen poskytnout informace 
     *                  o události, kterou zavolání dané metody ohlašuje
     */
    public void notice(IPlaceG actualPlace) {
        movePlayer();
    }
    
    /***************************************************************************
     * Připraví nové okno, které zobrazuje plánek místností
     */
    void initialize() {
        IGameG game = gui.getGame();
        game.addNeighborsListener(this);

        int yCoordinate = gui.getBounds().y + gui.getBounds().height;
        mapWindow.setLocation(0, yCoordinate);
        
        Icon map = game.getMap();
        mapLabel.setIcon(map);
        mapLabel.setBounds(0, 0, map.getIconWidth(), map.getIconHeight());
        
        mapWindow.setSize(map.getIconWidth()+15, map.getIconHeight()+35);
        
        Boolean visible = gui.isMapVisible();
        mapWindow.setVisible(visible);
    }
    
//== SOUKROMÉ A POMOCNÉ METODY TŘÍDY ===========================================
//== SOUKROMÉ A POMOCNÉ METODY INSTANCÍ ========================================
    /***************************************************************************
     * Umístí hráče na novou pozici na plánku
     */
    private void movePlayer() {
        Point position = gui.getGame().getActualPlace().getPosition();
        playerLabel.setLocation(position);
    }
    
    
//== INTERNÍ DATOVÉ TYPY =======================================================
//== TESTY A METODA MAIN =======================================================
//
//    /***************************************************************************
//     * Testovací metoda.
//     */
//    public static void test()
//    {
//        GameMap inst = new GameMap();
//    }
//    public static void main( String[] args )  {  test();  }

    

    
}
